module ysyx_22040213_aluop(
	input [2:0] funct3,
	input pc_en,
	input lm_en,
	input sm_en,
	input sub_en,
	input word_en,
	input rv64m_en,
	input arith_en,
	input lui_en,
	input srai,
	input rem,
	input remu,
	input remuw,
	input remw,
	input div,
	input divu,
	input divuw,
	input divw,
	input mul,
	input mulw,

	output [16:0] alu_op
);
	wire last = ~pc_en && ~(lm_en || sm_en) && ~word_en && ~lui_en;
assign alu_op[0]  = pc_en || lm_en || sm_en && ~word_en || (word_en && ~rv64m_en && ~funct3[0] && ~funct3[1] && ~funct3[2] && ~sub_en) ||(last && ~rv64m_en && ~funct3[2] && ~funct3[1] && ~funct3[0] && ~sub_en); //add
assign alu_op[1]  = word_en && ~rv64m_en && ~funct3[2] && ~funct3[1] && ~funct3[0] && sub_en ||( last && ~rv64m_en && ~funct3[2] && ~funct3[1] && ~funct3[0] && sub_en);// sub
assign alu_op[2] = last && ~rv64m_en && ~funct3[2] &&  funct3[1] && ~funct3[0];//slt
assign alu_op[3] = last && ~rv64m_en && ~funct3[2] &&  funct3[1] &&  funct3[0];//sltu
assign alu_op[4] = last && ~rv64m_en &&  funct3[2] &&  funct3[1] &&  funct3[0];//and
assign alu_op[5] = 1'b0;  //NOR
assign alu_op[6] = last && ~rv64m_en &&  funct3[2] &&  funct3[1] && ~funct3[0];  //OR
assign alu_op[7] = last && ~rv64m_en &&  funct3[2] && ~funct3[1] && ~funct3[0]; //xor
assign alu_op[8]  = word_en && ~rv64m_en && ~funct3[2] && ~funct3[1] &&  funct3[0] || (last && ~funct3[2] && ~funct3[1] && funct3[0]); //sllw sll
assign alu_op[9]  = word_en && ~rv64m_en &&  funct3[2] && ~funct3[1] &&  funct3[0] && ~arith_en && ~sub_en; //srl

assign alu_op[10] = word_en && ~rv64m_en &&  funct3[2] && ~funct3[1] &&  funct3[0] && ~arith_en && sub_en 
	        || (word_en && ~rv64m_en &&  funct3[2] && ~funct3[1] &&  funct3[0] && arith_en) 
         	|| (last && ~rv64m_en &&  funct3[2] && ~funct3[1] &&  funct3[0])
		|| srai; //sraw sraiw sra

assign alu_op[11] = ~pc_en && ~(lm_en || sm_en) && ~word_en && lui_en;//lui
assign alu_op[12] = word_en &&  rv64m_en && ~funct3[2] && ~funct3[1] && ~funct3[0] || (last && rv64m_en && ~funct3[2] && ~funct3[1] && ~funct3[0]) || mul || mulw; //mul
assign alu_op[13] = word_en &&  rv64m_en &&  funct3[2] && ~funct3[1] && ~funct3[0] || (last && rv64m_en &&  funct3[2] && ~funct3[1] && ~funct3[0]) || div || divw; //div
assign alu_op[14] = word_en &&  rv64m_en &&  funct3[2] &&  funct3[1] && ~funct3[0] || (last && rv64m_en &&  funct3[2] &&  funct3[1] && ~funct3[0]) || rem || remw; //rem
assign alu_op[15] = remu || remuw;
assign alu_op[16] = divu || divuw;


endmodule
